import { sm4 } from "sm-crypto";
import CryptoJS from 'crypto-js';

const masterKey = "ikun"; // 由后端规定一个主密钥,严格规则下该密钥应该由后端动态生成并返回给前端

// 根据指定的时间戳和主密钥生成 SM4 密钥
export const generateTimeKey = (t: Date = new Date()): string => { // 动态生成 SM4 密钥
  const hourlyTimestamp = getHourlyTimestamp(t); // 获取当前小时的时间戳
  const hmac = CryptoJS.HmacSHA256(hourlyTimestamp, masterKey); // 使用 HmacSHA256 算法计算 HMAC 值
  const sm4KeyHex = hmac.toString(CryptoJS.enc.Hex).substring(0, 32); // 截取前 16 字节作为 SM4 密钥（128 位）
  return sm4KeyHex;
};

// 返回以小时为单位的时间戳字符串
export function getHourlyTimestamp(t: Date = new Date()): string {
  const YYYY = t.getUTCFullYear();
  const MM = String(t.getUTCMonth() + 1).padStart(2, "0"); // getUTCMonth() 返回的是从 0 开始的索引
  const DD = String(t.getUTCDate()).padStart(2, "0");
  const HH = String(t.getUTCHours()).padStart(2, "0");
  return `${YYYY}${MM}${DD}${HH}`;
}

export const encrypt = (data: any, pwdKey: string = generateTimeKey()) => {
  try {
    const params = JSON.stringify(data);
    const iv = CryptoJS.lib.WordArray.random(16).toString(CryptoJS.enc.Hex)
    const encrypt = sm4.encrypt(params, pwdKey, { mode: 'cbc', iv: iv});
    return iv + encrypt;
  } catch (error) {
    console.log(error);
  }
  return;
};

/*
 * data 待解密密文
 */
// export const decrypt = (data: any, pwdKey: string) => {
//   const decrypt = sm4.decrypt(data, pwdKey) // 加密，不使用 padding，输出16进制字符串
//   return decrypt
// }
// /**
//  * AES加密
//  * @param data
//  * @param str
//  */
// export const encrypt = (data: string, str: string) => {
//   const key = CryptoJS.enc.Latin1.parse(str)
//   const encrypted = CryptoJS.AES.encrypt(data, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7})
//   return encrypted.toString()
// }

// /**
//  * AES解密
//  * @param encrypted
//  * @param key
//  */
// export const decay = (encrypted: string, key: string) => {
//   const cryptokey = CryptoJS.enc.Utf8.parse(key)
//   const iv = CryptoJS.enc.Utf8.parse('')
//   const decrypted = CryptoJS.AES.decrypt(encrypted, cryptokey, {
//     iv: iv,
//     mode: CryptoJS.mode.ECB,
//     padding: CryptoJS.pad.Pkcs7,
//   })
//   return decrypted.toString(CryptoJS.enc.Utf8)
// }
